import os
import re
import shutil
from collections import defaultdict

# 定义文件夹路径
folder_path = r'D:\study\python\123\黄埔内部'
output_base_path = r'C:\Users\Ading\Desktop\点位文件夹'
log_file_path = r'C:\Users\Ading\Desktop\image_processing_log.txt'  # 日志文件路径

# 创建日志文件
log_file = open(log_file_path, 'w', encoding='utf-8')


# 日志函数
def log_message(message):
    print(message)  # 控制台打印
    log_file.write(message + "\n")  # 写入日志文件


# 字典存储每个点位编号对应的文件
number_to_filenames = defaultdict(list)
unique_numbers = set()
missing_points = []  # 用于记录未找到齐全图片的点位

# 用于统计 LHu 和去掉 LHu 后图片数量
total_lhu_found = 0  # LHu 图片总数
total_no_lhu_found = 0  # 去掉 LHu 后图片总数


# 减秒数查找文件的函数
def decrement_seconds(filename):
    match = re.search(r'(\d{4}_\d{2}_\d{2} \d{2}_\d{2}_(\d{2}))', filename)
    if match:
        time_parts = match.group(0).split(' ')
        date_str = time_parts[0]
        time_str = time_parts[1]
        hour, minute, second = map(int, time_str.split('_'))

        # 尝试减去秒数
        if second > 0:
            second -= 1
        else:
            second = 59
            if minute > 0:
                minute -= 1
            else:
                minute = 59
                if hour > 0:
                    hour -= 1
                else:
                    hour = 23  # 如果小时也为0，表示跨天

        # 重新构建时间字符串
        new_time_str = f"{hour:02}_{minute:02}_{second:02}"
        new_filename = filename.replace(time_str, new_time_str)
        return new_filename
    return filename


# 遍历文件夹，收集文件并提取编号
for filename in os.listdir(folder_path):
    if filename.lower().endswith('.jpg'):
        # 匹配 'LHu'（忽略大小写）后跟一组数字（用非数字字符分隔）
        match = re.search(r'LHu([\d]+(?:[^\d]+[\d]+)*)', filename, re.IGNORECASE)
        if match:
            number_with_separators = match.group(1)
            # 将数字按非数字字符分隔
            number_strings = re.split(r'\D+', number_with_separators)

            for num_str in number_strings:
                if num_str:
                    num = int(num_str)
                    unique_numbers.add(num)

                    # 去掉 'LHu' 并获取文件名
                    filtered_filename = re.sub(r' LHu.*(?=\.jpg$)', '', filename, flags=re.IGNORECASE).strip()

                    # 存储编号对应的文件名
                    number_to_filenames[num].append(filtered_filename)

log_message(f"提取完成，共找到 {len(unique_numbers)} 个唯一的编号。")

# 创建各点位文件夹并复制文件
for num in unique_numbers:
    prefixed_number = f"HPCZC-LHu-JK{num:03d}"
    point_folder = os.path.join(output_base_path, prefixed_number)
    os.makedirs(point_folder, exist_ok=True)

    filenames = number_to_filenames[num]
    lhu_count = len(filenames)
    lhu_found_count = 0  # LHu图片找到的数量
    no_lhu_count = 0  # 去掉LHu后的图片找到的数量

    for filename in filenames:
        src_path = os.path.join(folder_path, filename)

        # 如果文件存在，直接复制
        if os.path.exists(src_path):
            dest_path = os.path.join(point_folder, filename)
            shutil.copy2(src_path, dest_path)
            lhu_found_count += 1
        else:
            # 尝试减秒数查找文件
            found = False
            for _ in range(3):  # 最多尝试三次
                filename = decrement_seconds(filename)
                src_path = os.path.join(folder_path, filename)
                if os.path.exists(src_path):
                    dest_path = os.path.join(point_folder, filename)
                    shutil.copy2(src_path, dest_path)
                    lhu_found_count += 1
                    found = True
                    break

            # 如果三次尝试后仍然找不到文件
            if not found:
                log_message(f"文件 {filename} 不存在，跳过。")

    # 去掉 'LHu' 后，生成不带 'LHu' 的文件名集合
    no_lhu_files = [re.sub(r' LHu.*(?=\.jpg$)', '', f, flags=re.IGNORECASE).strip() for f in filenames]
    unique_no_lhu_files = set(no_lhu_files)
    no_lhu_count = len(unique_no_lhu_files)

    # 输出LHu找到的图片数量和去掉LHu后找到的数量
    log_message(f"{prefixed_number} - LHu文件数: {lhu_count}，去掉LHu后文件数: {no_lhu_count}")

    # 累加到总统计
    total_lhu_found += lhu_found_count
    total_no_lhu_found += no_lhu_count

    # 更新文件夹名称，添加图片数量后缀
    point_folder_with_count = f"{point_folder}_{lhu_found_count}张"
    os.rename(point_folder, point_folder_with_count)

    # 检查是否去掉 'LHu' 后的图片数量少于原始数量
    if no_lhu_count < lhu_count:
        # 如果图片未找全，记录点位
        message = f"{prefixed_number} 的图片未找到齐全，LHu 文件数: {lhu_count}，去掉 LHu 后找到的文件数: {no_lhu_count}"
        log_message(message)
        missing_points.append(message)
    else:
        # 若齐全，则直接记录"图片已找全"信息
        log_message(f"{prefixed_number} 图片已找全。")

# 最后打印所有未找全的点位
if missing_points:
    log_message("\n以下点位的图片未找到齐全：")
    for message in missing_points:
        log_message(message)

# 打印总统计信息
total_files = total_lhu_found + total_no_lhu_found  # 总文件数
log_message("\n统计信息：")
log_message(f"所有点位LHu文件总数: {total_lhu_found}")
log_message(f"所有点位去掉LHu后文件总数: {total_no_lhu_found}")
log_message(f"总文件数: {total_files}")

# 关闭日志文件
log_file.close()
